/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package test.net.sourceforge.pmd.renderers; import junit.framework.TestCase; import net.sourceforge.pmd.Report; import net.sourceforge.pmd.RuleContext; import net.sourceforge.pmd.RuleViolation; import net.sourceforge.pmd.renderers.XMLRenderer; import test.net.sourceforge.pmd.testframework.MockRule; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class XMLRendererTest extends TestCase { private MockRule RULE1 = new MockRule("RULE1", "RULE1", "msg"); private MockRule RULE2 = new MockRule("RULE2", "RULE2", "msg"); private RuleContext ctx = new RuleContext(); public XMLRendererTest(String name) { super(name); } public void testEmptyReport() throws Throwable { XMLRenderer renderer = new XMLRenderer(); String rendered = renderer.render(new Report()); assertTrue("Expected empty PMD tag.", rendered.indexOf("violation") < 0); } public void testErrorReport() throws Throwable { Report r = new Report(); r.addError(new Report.ProcessingError("test_msg", "test_filename")); XMLRenderer renderer = new XMLRenderer(); assertTrue(renderer.render(r).indexOf("msg=\"test_msg\"/>") != -1); } public void testSingleReport() throws Throwable { Report report = new Report(); ctx.setSourceCodeFilename("testSingleReport"); report.addRuleViolation(new RuleViolation(RULE1, 1, "Rule1", ctx)); XMLRenderer renderer = new XMLRenderer(); String rendered = renderer.render(report); // <?xml version="1.0"?> // <pmd> // <file name="testSingleReport"> // <violation line="1" rule="RULE1"> // Rule1 // </violation> // </file> // </pmd> List expectedStrings = new ArrayList(); expectedStrings.add("<pmd>"); expectedStrings.add("<file name=\"testSingleReport\">"); expectedStrings.add("<violation line=\"1\" rule=\"RULE1\">"); expectedStrings.add("Rule1"); expectedStrings.add("</violation>"); expectedStrings.add("</file>"); expectedStrings.add("</pmd>"); verifyPositions(rendered, expectedStrings); } public void testDoubleReport() throws Throwable { Report report = new Report(); ctx.setSourceCodeFilename("testDoubleReport"); report.addRuleViolation(new RuleViolation(RULE1, 1, "Rule1", ctx)); report.addRuleViolation(new RuleViolation(RULE2, 2, "Rule2", ctx)); // <?xml version="1.0"?> // <pmd> // <file name="testSingleReport"> // <violation line="1" rule="RULE1"> // Rule1 // </violation> // <violation line="2" rule="RULE2"> // Rule2 // </violation> // </file> // </pmd> List expectedStrings = new ArrayList(); expectedStrings.add("<pmd>"); expectedStrings.add("<file name=\"testDoubleReport\">"); expectedStrings.add("<violation line=\"1\" rule=\"RULE1\">"); expectedStrings.add("Rule1"); expectedStrings.add("</violation>"); expectedStrings.add("<violation line=\"2\" rule=\"RULE2\">"); expectedStrings.add("Rule2"); expectedStrings.add("</violation>"); expectedStrings.add("</file>"); expectedStrings.add("</pmd>"); XMLRenderer renderer = new XMLRenderer(); verifyPositions(renderer.render(report), expectedStrings); } public void testTwoFiles() throws Throwable { Report report = new Report(); ctx.setSourceCodeFilename("testTwoFiles_0"); report.addRuleViolation(new RuleViolation(RULE1, 1, "Rule1", ctx)); ctx.setSourceCodeFilename("testTwoFiles_1"); report.addRuleViolation(new RuleViolation(RULE1, 1, "Rule1", ctx)); // <?xml version="1.0"?> // <pmd> // <file name="testTwoFiles_0"> // <violation line="1" rule="RULE1"> // Rule1 // </violation> // </file> // <file name="testTwoFiles_1"> // <violation line="1" rule="RULE1"> // Rule1 // </violation> // </file> // </pmd> List expectedStrings = new ArrayList(); expectedStrings.add("<pmd>"); expectedStrings.add("<file name=\"testTwoFiles_0\">"); expectedStrings.add("<violation line=\"1\" rule=\"RULE1\">"); expectedStrings.add("Rule1"); expectedStrings.add("</violation>"); expectedStrings.add("</file>"); expectedStrings.add("<file name=\"testTwoFiles_1\">"); expectedStrings.add("<violation line=\"1\" rule=\"RULE1\">"); expectedStrings.add("Rule1"); expectedStrings.add("</violation>"); expectedStrings.add("</file>"); expectedStrings.add("</pmd>"); XMLRenderer renderer = new XMLRenderer(); verifyPositions(renderer.render(report), expectedStrings); } public void testUnorderedFiles() throws Throwable { Report report = new Report(); ctx.setSourceCodeFilename("testTwoFiles_0"); report.addRuleViolation(new RuleViolation(RULE1, 1, "Rule1", ctx)); ctx.setSourceCodeFilename("testTwoFiles_1"); report.addRuleViolation(new RuleViolation(RULE1, 1, "Rule1", ctx)); ctx.setSourceCodeFilename("testTwoFiles_0"); report.addRuleViolation(new RuleViolation(RULE2, 2, "Rule2", ctx)); // <?xml version="1.0"?> // <pmd> // <file name="testTwoFiles_0"> // <violation line="1" rule="RULE1"> // Rule1 // </violation> // </file> // <file name="testTwoFiles_1"> // <violation line="1" rule="RULE1"> // Rule1 // </violation> // </file> // </pmd> List expectedStrings = new ArrayList(); expectedStrings.add("<pmd>"); expectedStrings.add("<file name=\"testTwoFiles_0\">"); expectedStrings.add("<violation line=\"1\" rule=\"RULE1\">"); expectedStrings.add("Rule1"); expectedStrings.add("</violation>"); expectedStrings.add("<violation line=\"2\" rule=\"RULE2\">"); expectedStrings.add("Rule2"); expectedStrings.add("</violation>"); expectedStrings.add("</file>"); expectedStrings.add("<file name=\"testTwoFiles_1\">"); expectedStrings.add("<violation line=\"1\" rule=\"RULE1\">"); expectedStrings.add("Rule1"); expectedStrings.add("</violation>"); expectedStrings.add("</file>"); expectedStrings.add("</pmd>"); XMLRenderer renderer = new XMLRenderer(); verifyPositions(renderer.render(report), expectedStrings); } /** * Verify correct escaping in generated XML. */ public void testEscaping() throws Throwable { Report report = new Report(); ctx.setSourceCodeFilename("testEscaping: Less than: < Greater than: > Ampersand: & Quote: \" 'e' acute: \u00E9"); report.addRuleViolation(new RuleViolation(RULE1, 1, "[RULE] Less than: < Greater than: > Ampersand: & Quote: \" 'e' acute: \u00E9", ctx)); // <?xml version="1.0"?> // <pmd> // <file name="testEscaping: Less than: < Greater than: > Ampersand: & Quote: " 'e' acute: é"> // <violation line="1" rule="RULE1"> // [RULE] Less than: < Greater than: > Ampersand: & Quote: " 'e' acute: é // </violation> // </file> // </pmd> List expectedStrings = new ArrayList(); expectedStrings.add("<pmd>"); expectedStrings.add("<file name=\"testEscaping: Less than: "); expectedStrings.add("<"); expectedStrings.add(" Greater than: "); expectedStrings.add(">"); expectedStrings.add(" Ampersand: "); expectedStrings.add("&"); expectedStrings.add(" Quote: "); expectedStrings.add("""); expectedStrings.add(" 'e' acute: "); expectedStrings.add("é"); expectedStrings.add("\">"); expectedStrings.add("<violation line=\"1\" rule=\"RULE1\">"); expectedStrings.add("[RULE] Less than: "); expectedStrings.add("<"); expectedStrings.add(" Greater than: "); expectedStrings.add(">"); expectedStrings.add(" Ampersand: "); expectedStrings.add("&"); expectedStrings.add(" Quote: "); expectedStrings.add("""); expectedStrings.add(" 'e' acute: "); expectedStrings.add("é"); expectedStrings.add("</violation>"); expectedStrings.add("</file>"); expectedStrings.add("</pmd>"); XMLRenderer renderer = new XMLRenderer(); verifyPositions(renderer.render(report), expectedStrings); } public void verifyPositions(String rendered, List strings) { Iterator i = strings.iterator(); int currPos = 0; String lastString = "<?xml version=\"1.0\"?>"; while (i.hasNext()) { String str = (String) i.next(); int strPos = rendered.indexOf(str, currPos); assertTrue("Expecting: " + str + " after " + lastString, strPos > currPos); currPos = strPos; lastString = str; } } }